#include "stm32f10x.h"                  // Device header
#include "Encoder.h"

// 使用全局配置
extern Encoder_t Encoders[];
extern const uint8_t ENCODER_COUNT;

//// 编码器配置数组
//Encoder_t Encoders[] = {
//    // 编码器A: TIM2 (PA0-PA1)
//    {TIM2, GPIOA, GPIO_Pin_0, GPIO_Pin_1},	// 左电机
//    
//    // 编码器B: TIM4 (PB6-PB7)
//    {TIM4, GPIOB, GPIO_Pin_6, GPIO_Pin_7}	// 右电机
//};
//// 编码器数量
//#define ENCODER_COUNT (sizeof(Encoders)/sizeof(Encoders[0]))

/**
  * 函    数：编码器初始化
  * 参    数：无
  * 返 回 值：无
  */
void Encoder_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_ICInitTypeDef TIM_ICInitStructure;
    
    for(uint8_t i = 0; i < ENCODER_COUNT; i++) 
	{
        // 1. 时钟使能
        if(Encoders[i].TIMx == TIM2) 
		{
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        }
        else if(Encoders[i].TIMx == TIM4) 
		{
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        }
        
        // 2. GPIO配置 (浮空输入)
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Pin = Encoders[i].GPIO_PinA;
        GPIO_Init(Encoders[i].GPIOx, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = Encoders[i].GPIO_PinB;
        GPIO_Init(Encoders[i].GPIOx, &GPIO_InitStructure);
        
        // 3. 定时器基础配置
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
        TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 16位最大值
        TIM_TimeBaseInit(Encoders[i].TIMx, &TIM_TimeBaseStructure);
        
        // 4. 编码器接口配置
        TIM_EncoderInterfaceConfig(Encoders[i].TIMx, 
                                  TIM_EncoderMode_TI12, 
                                  TIM_ICPolarity_Rising, 
                                  TIM_ICPolarity_Rising);
        
        // 5. 输入捕获配置
        TIM_ICStructInit(&TIM_ICInitStructure);
        TIM_ICInitStructure.TIM_ICFilter = 0xF; // 滤波器
        
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
        TIM_ICInit(Encoders[i].TIMx, &TIM_ICInitStructure);
        
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
        TIM_ICInit(Encoders[i].TIMx, &TIM_ICInitStructure);
        
        // 6. 开启定时器
        TIM_Cmd(Encoders[i].TIMx, ENABLE);
	}
}

/**
  * 函    数：获取编码器的增量值
  * 参    数：无
  * 返 回 值：自上此调用此函数后，编码器的增量值
  */

//int16_t Encoder2_Get(void)
//{
//	/*使用Speed变量作为中继，目的是返回CNT后将其清零*/
//	int16_t Speed;
//	Speed = TIM_GetCounter(TIM2);
//	TIM_SetCounter(TIM2, 0);
//	return Speed;
//}

//int16_t Encoder4_Get(void)
//{
//	/*使用Speed变量作为中继，目的是返回CNT后将其清零*/
//	int16_t Speed;
//	Speed = TIM_GetCounter(TIM4);
//	TIM_SetCounter(TIM4, 0);
//	return Speed;
//}

int16_t Encoder_GetCount(int8_t encoder) 
{
    if(encoder >= ENCODER_COUNT) return 0;
    
    int16_t count = (int16_t)Encoders[encoder].TIMx->CNT;
    Encoders[encoder].TIMx->CNT = 0; // 读取后清零
    return count;
}

void Encoder_Clear(int8_t encoder) {
    if(encoder < ENCODER_COUNT) 
	{
        Encoders[encoder].TIMx->CNT = 0;
    }
}
